package main

import (
	"errors"
	"fmt"
)

//使用数组模拟栈的使用
type Stack struct {
	MaxTop int    //表示栈能存放的最大值
	Top    int    //表示栈顶
	arr    [5]int //数组模拟栈
}

func (s *Stack) Push(val int) (err error) {
	//先判断栈是否已经满了
	if s.Top == s.MaxTop-1 {
		fmt.Println("stack full")
		return errors.New("stack full")
	}
	s.Top++
	//放入数据
	s.arr[s.Top] = val
	return err
}

//出栈
func (s *Stack) Pop() (val int, err error) {
	//判断栈是不是空的
	if s.Top == -1 {
		fmt.Println("stack empty")
		return 0, errors.New("stack empty")
	}
	//先取值，在top--
	val = s.arr[s.Top]
	s.Top--
	return val, nil
}

//遍历栈，需要从栈顶开始遍历
func (s *Stack) Show() {
	//先判断栈是否为空
	if s.Top == -1 {
		fmt.Println("stack empty")
		return
	}
	for i := s.Top; i >= 0; i-- {
		fmt.Printf("arr[%d]=%d\n", i, s.arr[i])
	}
}

func main() {
	s := &Stack{
		MaxTop: 5,
		Top:    -1, //当栈顶为负一时，表示栈为空
		arr:    [5]int{},
	}
	//入栈
	s.Push(1)
	s.Push(2)
	s.Push(4)
	s.Push(7)
	s.Show()
	val, _ := s.Pop()
	fmt.Println("出栈val=", val)
	val, _ = s.Pop()
	fmt.Println("出栈val=", val)
}
